//
//  PredicatePractice.m
//  regularExpression
//
//  Created by leiyan on 2017/4/19.
//  Copyright © 2017年 leiyan. All rights reserved.
//

#import "PredicatePractice.h"
#import "PersonModel.h"

@implementation PredicatePractice
+ (void)compareValue {
    /**
     比较运算符
     =、==：判断两个表达式是否相等，在谓词中=和==是相同的意思都是判断，而没有赋值这一说
     >= =>
     <=，=<
     >,<
     !=、<>
     BETWEEN 必须满足表达式 BETWEEN {下限，上限}的格式，要求该表达式必须大于或等于下限，并小于或等于上限
     */
    
    NSNumber *testNumber = @123;
    //    NSString *regularExpression = @"SELF <> 123";
    //    NSPredicate *predicate = [NSPredicate predicateWithFormat:regularExpression];
    NSString *regularExpression = @"SELF BENTWEEN {100, 200}";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:regularExpression];
    if ([predicate evaluateWithObject:testNumber]) {
        NSLog(@"right");
    } else {
        NSLog(@"error");
    }
}
+ (void)filteValue {
    /**
     AND、&&
     OR、||
     NOT、!
     */
    NSArray *testArray = @[@1, @2, @3, @4, @5, @6];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF > 2 && SELF < 5"];
    NSArray *filterArray = [testArray filteredArrayUsingPredicate:predicate];
    NSLog(@"filterArray:%@", filterArray);
}
+ (void)filteString {
    /**
     BEGINSWITH：检查某个字符串是否以指定的字符串开头（如判断字符串是否以a开头：BEGINSWITH 'a'）
     ENDSWITH：检查某个字符串是否以指定的字符串结尾
     CONTAINS：检查某个字符串是否包含指定的字符串
     LIKE：检查某个字符串是否匹配指定的字符串模板。其之后可以跟?代表一个字符和*代表任意多个字符两个通配符。比如"name LIKE '*ac*'"，这表示name的值中包含ac则返回YES；"name LIKE '?ac*'"，表示name的第2、3个字符为ac时返回YES。
     MATCHES：检查某个字符串是否匹配指定的正则表达式。虽然正则表达式的执行效率是最低的，但其功能是最强大的，也是我们最常用的。
     
     注：字符串比较都是区分大小写和重音符号的。如：café和cafe是不一样的，Cafe和cafe也是不一样的。如果希望字符串比较运算不区分大小写和重音符号，请在这些运算符后使用[c]，[d]选项。其中[c]是不区分大小写，[d]是不区分重音符号，其写在字符串比较运算符之后，比如：name LIKE[cd] 'cafe'，那么不论name是cafe、Cafe还是café上面的表达式都会返回YES。
     */
    PersonModel *sunny = [PersonModel personWithName:@"sunny" age:29 sex:PersonSexMale];
    PersonModel *jack = [PersonModel personWithName:@"jack" age:22 sex:PersonSexMale];
    //  首先我们来看一些简单的使用
    //  1.判断姓名是否是以s开头的
    NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"name LIKE 's*'"];
    //  输出为：sunny:1, jack:0
    NSLog(@"sunny:%d, jack:%d", [pred1 evaluateWithObject:sunny], [pred1 evaluateWithObject:jack]);
    
    //  2.判断年龄是否大于25
    NSPredicate *pred2 = [NSPredicate predicateWithFormat:@"age > 25"];
    //  输出为：sunny的年龄是否大于25：1, jack的年龄是否大于25：0
    NSLog(@"sunny的年龄是否大于25：%d, jack的年龄是否大于25：%d", [pred2 evaluateWithObject:sunny], [pred2 evaluateWithObject:jack]);
    
    
    NSArray *array = @[[PersonModel personWithName:@"Jack" age:20 sex:PersonSexMale],
                       [PersonModel personWithName:@"Rose" age:22 sex:PersonSexFamale],
                       [PersonModel personWithName:@"Jackson" age:30 sex:PersonSexMale],
                       [PersonModel personWithName:@"Johnson" age:35 sex:PersonSexMale]];
    //  要求取出包含‘son’的元素
    NSPredicate *pred3 = [NSPredicate predicateWithFormat:@"name CONTAINS 'son'"];
    NSArray *newArray = [array filteredArrayUsingPredicate:pred3];
    NSLog(@"%@", newArray);
}
+ (void)filteContainer {
    /**
     集合运算符
     ANY、SOME：集合中任意一个元素满足条件，就返回YES。
     ALL：集合中所有元素都满足条件，才返回YES。
     NONE：集合中没有任何元素满足条件就返回YES。如:NONE person.age < 18，表示person集合中所有元素的age>=18时，才返回YES。
     IN：等价于SQL语句中的IN运算符，只有当左边表达式或值出现在右边的集合中才会返回YES。我们通过一个例子来看一下
     */
    NSArray *filterArray = @[@"ab", @"abc"];
    NSArray *array = @[@"a", @"ab", @"abc", @"abcd"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", filterArray];
    NSLog(@"%@", [array filteredArrayUsingPredicate:predicate]);
}

+ (void)filteDynamicState {
    /**
     占位符参数
     %K：用于动态传入属性名
     %@：用于动态设置属性值
     */
    NSArray *array = @[[PersonModel personWithName:@"Jack" age:20 sex:PersonSexMale],
                       [PersonModel personWithName:@"Rose" age:22 sex:PersonSexFamale],
                       [PersonModel personWithName:@"Jackson" age:30 sex:PersonSexMale],
                       [PersonModel personWithName:@"Johnson" age:35 sex:PersonSexMale]];
    //  定义一个property来存放属性名，定义一个value来存放值
    NSString *property = @"name";
    NSString *value = @"Jack";
    //  该谓词的作用是如果元素中property属性含有值value时就取出放入新的数组内，这里是name包含Jack
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"%K CONTAINS %@", property, value];
    NSArray *newArray = [array filteredArrayUsingPredicate:pred];
    NSLog(@"newArray:%@", newArray);
    
    //  创建谓词，属性名改为age，要求这个age包含$VALUE字符串
    NSPredicate *predTemp = [NSPredicate predicateWithFormat:@"%K > $VALUE", @"age"];
    // 指定$VALUE的值为 25
    NSPredicate *pred1 = [predTemp predicateWithSubstitutionVariables:@{@"VALUE" : @25}];
    NSArray *newArray1 = [array filteredArrayUsingPredicate:pred1];
    NSLog(@"newArray1:%@", newArray1);
    
    //  修改 $VALUE的值为32
    NSPredicate *pred2 = [predTemp predicateWithSubstitutionVariables:@{@"VALUE" : @32}];
    NSArray *newArray2 = [array filteredArrayUsingPredicate:pred2];
    NSLog(@"newArray2:%@", newArray2);
}
@end
